<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 1、函数的多面性 写的一个function 可以是一个普通函数 也可以是一个对象，还可以是一个构造函数(类),每次写function具体是用着什么已经固定了
        function fn(){
            console.log('fn多面性')
        }
        // 将fn当做普通函数使用
        fn();
        // 将fn当做对象使用
        console.log(fn.length);//获取到函数的形参个数
        // 将fn当做类使用
        let f = new fn();
        console.log(f)
        // 2、new做了什么事情
        function Person(name){
            // 一旦new类 系统会自动的按照下面的步骤执行
            // 1、形参赋值 等价于执行了 let name = '旺财';
            // 2、创建当前类的对象 等价于 执行了 let obj = new Object;
            // 3、创建this 等价于 执行了 let this = obj;
            // 4、顺序执行函数体中的代码
            console.log(name);
            // 5、返回this对应的对象
        }
        let p = new Person('旺财')
        console.log(p)
        // 3、this指向问题 this永远都是谁调用指向谁

        function Student(idCard){
            this.idCard = idCard;
            this.study = function(){
                console.log(this.idCard,'好好学习')
            }
        }
        // 一旦new之后系统会自动的创建对象 并且自动返回这个对象 所以 函数体中的this 表示的就是当前接受的这个对象
        let s = new Student(10011);
        s.study();
    </script>
</body>
</html>